#ifndef _SEM_H_
#define _SEM_H_

#include <sys/sem.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <semaphore.h>
#include <fcntl.h>
#include <errno.h>

#include <string>

#include "shptr.h"

#define MAX_SEMNUM 10

/**
 * Esta clase encapsula la API de semáforos de Linux. Utiliza semáforos
 * POSIX y no System V.
 */
class Semaphore {
    /**
     * Puntero a un área compartida de memoria donde se guardará
     * la estructura del semáforo.
     */
    SharedPointer<sem_t, 1> psem;

    /** Estado del semáforo. */
	bool good;

public:
    /**
     * Crea un semáforo sin estructura asociada.
     */
	Semaphore();

	/**
     * Crea el área de memoria compartida donde se guardará
     * el semáforo, inicializa la estructura del semáforo y
     * actualiza el valor del semáforo a val.
     */
	bool init(int val);

	/**
	 * Operación wait sobre el semáforo.
	 */
	void wait();

	/**
	 * Operación signal sobre el semáforo.
	 */
	void signal();

	/**
	 * Libera los recursos ocupados del sistema operativo.
	 */
	void destroy();

	/**
	 * Devuelve el valor del semáforo.
	 */
	int getValue();

	/**
	 * Devuelve true si y solo si el semáforo ya fue inicializado
	 * y aún no fue destruido.
	 */
	operator bool();
};

#endif
